package sets;

import java.util.List;
import java.util.Map;

import universe.IUniverseOfDiscourse;
import utils.Element;
import utils.Interval;
import memberships.MembershipFunction;

public interface IFuzzySet {
	
	public enum Type {
		TYPE1, TYPE2, INTERVAL;
	}

	public Boolean isEmpty();
	public Boolean isConcave();	// wklęsły
	public Boolean isConvex();	//wypukły
	public Boolean isNormal();
	public ClassicalSet supp();
	public Interval sup();
	public Interval card();
	public Interval in();			// Degree of fuzziness
	public Interval c();			// Centroid
	public Interval hgt();		// Height of fuzzy set
	public ClassicalSet core();
	public ClassicalSet alphaCut(double alpha);
	public IFuzzySet union(IFuzzySet set);
	public IFuzzySet intersection(IFuzzySet set);
	public IFuzzySet complement(IFuzzySet set);
	
	// For fuzzy sets type 1
	public void setMembershipFunction(MembershipFunction membershipFunction);
	public MembershipFunction getMembershipFunction();
	
	// For interval-valued sets
	public void setLowerFuzzySet(FuzzySetType1 lowerSet);
	public void setUpperFuzzySet(FuzzySetType1 upperSet);
	public MembershipFunction getLowerMembershipFunction();
	public MembershipFunction getUpperMembershipFunction();
	
	public void setUniverseOfDiscorse(IUniverseOfDiscourse universe);
	public IUniverseOfDiscourse getUniverseOfDiscorse();
	
	public void setElements(List<Element> elements);
	public List<Element> getElements();
	public void addElement(Double element);
	public void clearElements();	// BUGFIX: for stupid references in java...
	
	public void setColumn(String column);
	public String getColumn();
	
	public Map<Double, Double> getElementsAsMap();
	public IFuzzySet.Type getType();
	
}
